// 保存原始的open方法
let originOpen = XMLHttpRequest.prototype.open;
let originSend = XMLHttpRequest.prototype.send;

// 重写open方法
XMLHttpRequest.prototype.open = function () {
    // console.log('请求被拦截', this, arguments);
    return originOpen.apply(this, arguments);
};

// 用于保存请求的队列
const queue = []

// 重写send方法
XMLHttpRequest.prototype.send = function () {
    let args = arguments
    this.addEventListener('readystatechange', function () {
      /**
       * readyState的状态列表      
        0: 请求未初始化。这是请求已创建但尚未调用open()方法时的状态。
        1: 服务器连接已建立。此状态表示已调用open()方法，但尚未调用send()方法。
        2: 请求已接收。此状态表示已接收到部分响应数据。
        3: 请求处理中。此状态表示正在处理响应数据。
        4: 请求已完成，且响应已就绪。此时，可以通过访问responseText和responseXML属性来获取完整的响应数据。 
      */
      if (this.readyState === 2) {
        // console.log('请求已接收。此状态表示已接收到部分响应数据。')
      }
      if (this.readyState === 3) {
        // console.log('请求处理中。此状态表示正在处理响应数据。')
      }
      if (this.readyState === 4 && this.status === 200) {
        // console.log('响应被拦截', this, args);
      }
    });

    // 发送token的请求直接执行
    if (this._getTokenHttp) {
      originSend.apply(this, args);
      return;
    }

    // 获取到token后，再把queue的请求释放执行
    getToken().then(token => {
      while(queue.length) {
        queue.shift().call(this, token)
      }
    })

    queue.push(token => {
      this.setRequestHeader("Authorization", token); // 添加token请求头
      originSend.apply(this, args);
    })
};

// 缓存token
let token_cache = null;
// 异步获取token
function getToken() {
  if (token_cache) {
    return Promise.resolve(token_cache)
  }
  return new Promise((resolve, reject) => {
    let xhr = new XMLHttpRequest();
      xhr._getTokenHttp = true;
      xhr.open("GET", "/api/token", true);
      xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200) {
          let response = JSON.parse(xhr.responseText);
          // 处理响应数据
          token_cache = response.token
          resolve(token_cache)
        }
        if (xhr.status === 500) {
          reject()
        }
      };
      xhr.send();
  })
}

// 订阅socket的token更新到token_cache
/* WebSocket().on('token', (token) => {
  token_cache = token
}) */